package cn.com.csg.smartenergy.mqtt;

import cn.com.csg.smartenergy.common.Constant;
//import cn.com.csg.smartenergy.modules.biz.entity.IotDeviceEntity;
//import cn.com.csg.smartenergy.modules.biz.entity.PowerDeviceOnlineEntity;
//import cn.com.csg.smartenergy.modules.biz.iot.service.IotDeviceService;
//import cn.com.csg.smartenergy.modules.biz.service.PowerDeviceOnlineService;
//import cn.com.csg.smartenergy.modules.biz.service.RedisService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static cn.com.csg.smartenergy.mqtt.DeviceOnlineHandler.PUBLISH_DEVICE_STATUS;

@Slf4j
@Data
@Component
public class DeviceOfflineHandler {
//
//    @Autowired
//    private IotDeviceService deviceService;
//
//    @Autowired
//    private PowerDeviceOnlineService onlineService;
//
//    @Autowired
//    private RedisService redisService;

    @Autowired
    private DeviceMqttOnlineClient onlineClient;

    @Value("${real.time.data.prefix}")
    private String prefix;

    /**
     * 下线消息处理回调异步方法
     *
     * @param expiredKey 过期key
     * @throws MqttException
     */
    @Async
    public void handleOnlineMessage(String expiredKey) throws MqttException {
        System.out.println("下线消息处理回调异步方法");
//        if(expiredKey.startsWith(prefix + "_state_")){
//            log.info(String.format("Redis key 失效数据：expiredKey: %s", expiredKey));
//            //如果是 state_ 开头的key，进行处理
//            String[] keys = expiredKey.split(Constant.UNDER_LINE);
//            // 只处理 state_xxx 的数据
//            if (keys.length == 5) {
//                String deviceId = keys[2];
//                String stateTopic = prefix + PUBLISH_DEVICE_STATUS + deviceId;
//                MqttMessage stateMessage = new MqttMessage();
//                stateMessage.setQos(1);
//                JSONObject body = new JSONObject();
//                body.put(Constant.DEVICE_ID, deviceId);
//                body.put(Constant.STATE, Constant.OFFLINE);
//                body.put(Constant.EVENT_TIME, new Date());
//                stateMessage.setPayload(body.toJSONString().getBytes());
//                this.onlineClient.publish(stateTopic, stateMessage);
//
//                // 更新数据库设备状态
////                Long longDeviceId = Long.parseLong(deviceId);
//                IotDeviceEntity deviceEntity = new IotDeviceEntity();
//                deviceEntity.setId(Long.parseLong(deviceId));
//                // 设备最新状态
//                deviceEntity.setStatus(Constant.OFFLINE);
//                deviceEntity.setDeviceType(keys[4]);
//                // 保存设备状态到数据库
////                deviceService.saveOrUpdate(deviceEntity);
//                // 存储到redis队列
//                this.redisService.lRightPush(prefix.toUpperCase() + "_" + Constant.QUEUE_OFFLINE, JSON.toJSONString(deviceEntity));
//            } else {
//                log.warn(String.format("处理 Redis key 失效数据出现问题：expiredKey: %s", expiredKey));
//            }
//        }
    }

    /**
     * 异步处理设备下线队列
     */
    @Async
    public void handleOfflineQueue() {
        System.out.println("开始处理设备下线队列");
//        while(true) {
//            try {
//                Thread.sleep(2000);
//                List<String> offlineDeviceList = redisService.lRange(prefix.toUpperCase() + "_" + Constant.QUEUE_OFFLINE, 0, 4999);
//                if (offlineDeviceList != null && !offlineDeviceList.isEmpty()) {
//                    redisService.lTrim(prefix.toUpperCase() + "_" + Constant.QUEUE_OFFLINE, offlineDeviceList.size(), -1);
//                    List<IotDeviceEntity> deviceEntityList = new ArrayList<>();
//                    List<Long> deviceIds = new ArrayList<>();
//                    for (String device : offlineDeviceList) {
//                        IotDeviceEntity deviceEntity = JSON.parseObject(device, IotDeviceEntity.class);
//                        //新加的，如果是高低开关柜，则开关柜下面的开关都为上线状态
//                        if(StringUtils.equals("LVS",deviceEntity.getDeviceType())){
//                            List<IotDeviceEntity> childList = this.deviceService.getBaseMapper().selectList(
//                                    new LambdaQueryWrapper<IotDeviceEntity>().eq(IotDeviceEntity::getParentId, deviceEntity.getId()));
//                            if(CollectionUtils.isNotEmpty(childList)){
//                                for(IotDeviceEntity childEntity:childList){
//                                    childEntity.setStatus(deviceEntity.getStatus());
//                                    deviceEntityList.add(childEntity);
//                                    //deviceIds.add(childEntity.getId());
//                                }
//                            }
//                        }
//                        deviceEntityList.add(deviceEntity);
//                        deviceIds.add(deviceEntity.getId());
//                    }
//                    // 批量更新设备
//                    this.deviceService.updateBatchById(deviceEntityList);
//                    log.info(String.format("批量更新下线设备状态：个数: %d", offlineDeviceList.size()));
//                    // 设备下线
//                    List<PowerDeviceOnlineEntity> onlineEntityList = this.onlineService.selectBatchLastOnlineRecord(deviceIds);
//                    if (onlineEntityList != null && !onlineEntityList.isEmpty()) {
//                        for (PowerDeviceOnlineEntity onlineEntity : onlineEntityList) {
//                            onlineEntity.setEndtime(new Date());
//                        }
//                        // 更新设备下线时间
//                        this.onlineService.updateBatchById(onlineEntityList);
//                    }
//                }
//            } catch (Exception e) {
//                log.error(String.format("设备下线入库时出现异常"), e);
//            }
//        }
    }
}
